package slxy.jiangtao.dts.core.util;

import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
 * Code must be sexy
 * Created by Jiang Tao on 2017/5/25.
 * 说明：邮箱工具类
 */
public class EmailUtil {

    /**
     * 创建会话
     * @param myEmailSMTPHost 发件人的邮箱的 SMTP 服务器地址
     */
    public static Session creatSession(String myEmailSMTPHost) {
        Properties props = new Properties();                    // 参数配置
        props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议（JavaMail规范要求）
        props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");
        Session session = Session.getDefaultInstance(props);
        session.setDebug(false);
        return session;
    }

    /**
     * 创建一封只包含文本的简单邮件
     *
     * @param session      和服务器交互的会话
     * @param sendtor      发件人名字
     * @param sendMail     发件人邮箱
     * @param receiveMails 收件人邮箱列表
     * @param subject      邮件主题
     * @param content      邮件内容
     * @return
     * @throws Exception
     */
    public static MimeMessage createMimeMessage(Session session, String sendtor, String sendMail, List<Map> receiveMails, String subject, String content) throws Exception {
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人
        message.setFrom(new InternetAddress(sendMail, sendtor, "UTF-8"));

        // 3. To: 收件人（可以增加多个收件人、抄送、密送）
        for (Map receiveMail : receiveMails) {
            message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail.get("email").toString(), receiveMail.get("name").toString(), "UTF-8"));
        }

        // 4. Subject: 邮件主题
        message.setSubject(subject, "UTF-8");

        // 5. Content: 邮件正文（可以使用html标签）
        message.setContent(content, "text/html;charset=UTF-8");

        // 6. 设置发件时间
        message.setSentDate(new Date());

        // 7. 保存设置
        message.saveChanges();

        return message;
    }

    /**
     * @param session         会话
     * @param message         邮件
     * @param myEmailAccount  发件人账号
     * @param myEmailPassword 账号对应的密码（授权码）
     */
    public static void send(Session session, MimeMessage message, String myEmailAccount, String myEmailPassword) throws MessagingException {
        // 根据配置创建会话对象, 用于和邮件服务器交互
        Transport transport = session.getTransport();

        transport.connect(myEmailAccount, myEmailPassword);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 7. 关闭连接
        transport.close();
    }
}
